www.gusucode.com > VC++仿XP免费Prof UIS界面库-源码程序 > VC++仿XP免费Prof UIS界面库-源码程序/code/Samples/StatusPanes/ChildFormView.cpp

    //Download by http://www.NewXing.com
// ChildFormView.cpp : implementation file
//

#include "stdafx.h"
#include "StatusPanes.h"
#include "ChildFormView.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CChildFormView

IMPLEMENT_DYNCREATE(CChildFormView, CFormView)

CChildFormView::CChildFormView()
: CExtWS < CExtAFV < CFormView > > ( CChildFormView::IDD, ((CWnd *)NULL) )
,m_pWndEdit(NULL)
,m_pWndSliderCtrl(NULL)
,m_pWndButton(NULL)
,m_pWndProgressCtrl(NULL)
,m_pWndAnimateCtrl(NULL)
{
	//{{AFX_DATA_INIT(CChildFormView)
	m_nPosition = 1;
	m_nPaneType = 0;
	//}}AFX_DATA_INIT
	m_bInitComplete = false;
	m_pMainFrame = DYNAMIC_DOWNCAST(CMainFrame,AfxGetMainWnd());
}

CChildFormView::~CChildFormView()
{
}

void CChildFormView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CChildFormView)
	DDX_Control(pDX, IDC_DISABLE_PANE, m_btnDisablePane);
	DDX_Control(pDX, IDC_SPIN_POSITION, m_SpinPosition);
	DDX_Control(pDX, IDC_REMOVE_PANE, m_btnRemovePane);
	DDX_Control(pDX, IDC_ADD_PANE, m_btnAddPane);
	DDX_Control(pDX, IDC_HIDE_TEXT_ON_DISABLED_PANES, m_chkHideTextOnDisabledPanes);
	DDX_Control(pDX, IDC_OUTER_RECT_IN_FIRST_BAND, m_chkOuterRectInFirstBand);
	DDX_Control(pDX, IDC_DRAW_PANE_SEPARATORS, m_chkDrawPaneSeparators);
	DDX_Text(pDX, IDC_POSITION, m_nPosition);
	DDV_MinMaxInt(pDX, m_nPosition, 1, 20);
	DDX_Radio(pDX, IDC_RADIO_TYPE_TEXT, m_nPaneType);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CChildFormView, CFormView)
	//{{AFX_MSG_MAP(CChildFormView)
	ON_BN_CLICKED(IDC_DRAW_PANE_SEPARATORS, OnDrawPaneSeparators)
	ON_BN_CLICKED(IDC_OUTER_RECT_IN_FIRST_BAND, OnOuterRectInFirstBand)
	ON_BN_CLICKED(IDC_HIDE_TEXT_ON_DISABLED_PANES, OnHideTextOnDisabledPanes)
	ON_BN_CLICKED(IDC_ADD_PANE, OnAddPane)
	ON_BN_CLICKED(IDC_REMOVE_PANE, OnRemovePane)
	ON_BN_CLICKED(IDC_DISABLE_PANE, OnDisablePane)
	ON_BN_CLICKED(IDC_STATUS_BAR_BUTTON, OnStatusBarButton)
	ON_UPDATE_COMMAND_UI(ID_APP_ABOUT, OnUpdateAppAbout)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CChildFormView diagnostics

#ifdef _DEBUG
void CChildFormView::AssertValid() const
{
	CFormView::AssertValid();
}

void CChildFormView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CChildFormView message handlers

BOOL CChildFormView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (!CFormView::PreCreateWindow(cs))
		return FALSE;
	
	cs.dwExStyle &= ~(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE);
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
	
	return TRUE;
}

//////////////////////////////////////////////////////////////////////////

void CChildFormView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	
	ShowSizeGrip(FALSE);
	
	m_SpinPosition.SetRange(1,20);

	m_chkHideTextOnDisabledPanes.SetCheck(0);
	OnHideTextOnDisabledPanes();

	m_bInitComplete = true;
}

//////////////////////////////////////////////////////////////////////////

void CChildFormView::OnDrawPaneSeparators() 
{
	if( m_chkDrawPaneSeparators.GetCheck() == 1 ){
		m_pMainFrame->m_wndStatusBar.DrawPaneSeparatorsSet(true);
		m_chkOuterRectInFirstBand.EnableWindow(0);
	}
	else{
		m_pMainFrame->m_wndStatusBar.DrawPaneSeparatorsSet(false);
		m_chkOuterRectInFirstBand.EnableWindow(1);
	}

	if( m_pWndButton && ::IsWindow(m_pWndButton->m_hWnd)){
		if(m_chkDrawPaneSeparators.GetCheck() == 1){
			m_pWndButton->SetDrawBorder(1);
		}
		else{
			m_pWndButton->SetDrawBorder(0);
		}
	}
	
}

void CChildFormView::OnOuterRectInFirstBand() 
{
	m_pMainFrame->m_wndStatusBar.OuterRectInFirstBandSet( 
		m_chkOuterRectInFirstBand.GetCheck() == 1 
		);
}

void CChildFormView::OnHideTextOnDisabledPanes() 
{
	m_pMainFrame->m_wndStatusBar.HideTextOnDisabledPanesSet( 
		m_chkHideTextOnDisabledPanes.GetCheck() == 1 
		);
}

//////////////////////////////////////////////////////////////////////////

void CChildFormView::OnAddPane() 
{
	UpdateData();
	
	if( m_nPosition < 1 || m_nPosition > 20 )
		return;

	switch( m_nPaneType ) 
	{
	case 0: // text
		{
			bool bRet = m_pMainFrame->m_wndStatusBar.AddPane(IDS_PANE_TEXT,m_nPosition);
			if(!bRet){
				AfxMessageBox(_T("Pane index out of range\nor pane with same ID already exists in the status bar"), MB_ICONERROR);
				return;
			}
		}
		break;

	case 1: // edit
		{
			m_pWndEdit = new CExtStatusBarEdit;
			if (!m_pWndEdit->Create(
				WS_CHILD|WS_VISIBLE|WS_TABSTOP, 
				CRect(0,0,0,0), 
				&m_pMainFrame->m_wndStatusBar, 
				0))
			{
				TRACE(_T("Failed to create edit control.\n"));
				return;
			}
			
			m_pWndEdit->SetFont(
				CFont::FromHandle(
				(HFONT)::GetStockObject(DEFAULT_GUI_FONT)
				)
				);

			m_pWndEdit->SetWindowText(_T("Type text here..."));
			
			bool bRet = m_pMainFrame->m_wndStatusBar.AddPane(IDS_PANE_EDIT,m_nPosition);
			if(!bRet){
				AfxMessageBox(_T("Pane index out of range\nor pane with same ID already exists in the status bar"), MB_ICONERROR);
				return;
			}
			
			int nIndex = m_pMainFrame->m_wndStatusBar.CommandToIndex(IDS_PANE_EDIT);
			if (nIndex == -1)
				return;
			
			m_pMainFrame->m_wndStatusBar.SetPaneWidth(nIndex, 100);
			m_pMainFrame->m_wndStatusBar.AddPaneControl(m_pWndEdit, IDS_PANE_EDIT, true);
		}
		break;

	case 2: // progress ctrl
		{
			m_pWndProgressCtrl = new CExtStatusBarProgressCtrl;
			if (!m_pWndProgressCtrl->Create(
				WS_CHILD|WS_VISIBLE|WS_TABSTOP, //|PBS_SMOOTH
				CRect(0,0,0,0), 
				&m_pMainFrame->m_wndStatusBar, 
				0))
			{
				TRACE(_T("Failed to create progress control.\n"));
				return;
			}

			m_pWndProgressCtrl->ModifyStyleEx(WS_EX_STATICEDGE,0,SWP_FRAMECHANGED);

			m_pWndProgressCtrl->SetRange(0,300);
			m_pWndProgressCtrl->SetPos(0);
			m_pWndProgressCtrl->SetStep(1);

			bool bRet = m_pMainFrame->m_wndStatusBar.AddPane(IDS_PANE_PROGRESS,m_nPosition);
			if(!bRet){
				AfxMessageBox(_T("Pane index out of range\nor pane with same ID already exists in the status bar"), MB_ICONERROR);
				return;
			}
			
			int nIndex = m_pMainFrame->m_wndStatusBar.CommandToIndex(IDS_PANE_PROGRESS);
			if (nIndex == -1)
				return;
			
			m_pMainFrame->m_wndStatusBar.SetPaneWidth(nIndex, 100);
			m_pMainFrame->m_wndStatusBar.AddPaneControl(m_pWndProgressCtrl, IDS_PANE_PROGRESS, true);

			m_pWndProgressCtrl->SetTimer(0,1,NULL);
		}
		break;

	case 3: // slider ctrl
		{
			m_pWndSliderCtrl = new CExtStatusBarSliderCtrl;
			if (!m_pWndSliderCtrl->Create(
				WS_CHILD|WS_VISIBLE|WS_TABSTOP|TBS_HORZ, 
				CRect(0,0,0,0), 
				&m_pMainFrame->m_wndStatusBar, 
				0))
			{
				TRACE(_T("Failed to create slider control.\n"));
				return;
			}
			
			bool bRet = m_pMainFrame->m_wndStatusBar.AddPane(IDS_PANE_SLIDER_CTRL,m_nPosition);
			if(!bRet){
				AfxMessageBox(_T("Pane index out of range\nor pane with same ID already exists in the status bar"), MB_ICONERROR);
				return;
			}
			
			int nIndex = m_pMainFrame->m_wndStatusBar.CommandToIndex(IDS_PANE_SLIDER_CTRL);
			if (nIndex == -1)
				return;
			
			m_pMainFrame->m_wndStatusBar.SetPaneWidth(nIndex, 80);
			m_pMainFrame->m_wndStatusBar.AddPaneControl(m_pWndSliderCtrl, IDS_PANE_SLIDER_CTRL, true);
		}
		break;
		
	case 4: // button
		{
			m_pWndButton = new CExtStatusBarButton;
			if (!m_pWndButton->Create(
				_T("Button"),
				WS_CHILD|WS_VISIBLE|WS_TABSTOP,
				CRect(0,0,0,0), 
				&m_pMainFrame->m_wndStatusBar, 
				IDC_STATUS_BAR_BUTTON))
			{
				TRACE(_T("Failed to create button control.\n"));
				return;
			}
			m_pWndButton->SetFlat();
			m_pWndButton->SetDrawBorder( m_chkDrawPaneSeparators.GetCheck()==1 );
			
			bool bRet = m_pMainFrame->m_wndStatusBar.AddPane(IDS_PANE_BUTTON,m_nPosition);
			if(!bRet){
				AfxMessageBox(_T("Pane index out of range\nor pane with same ID already exists in the status bar"), MB_ICONERROR);
				return;
			}
			
			int nIndex = m_pMainFrame->m_wndStatusBar.CommandToIndex(IDS_PANE_BUTTON);
			if (nIndex == -1)
				return;
			
			m_pMainFrame->m_wndStatusBar.SetPaneWidth(nIndex, 50);
			m_pMainFrame->m_wndStatusBar.AddPaneControl(m_pWndButton, IDS_PANE_BUTTON, true);
		}
		break;
	
	case 5: // animate ctrl
		{
			m_pWndAnimateCtrl = new CExtStatusBarAnimateCtrl;
			if (!m_pWndAnimateCtrl->Create(
				WS_CHILD|WS_VISIBLE|WS_TABSTOP|ACS_CENTER|ACS_AUTOPLAY|ACS_TRANSPARENT,
				CRect(0,0,0,0), 
				&m_pMainFrame->m_wndStatusBar, 
				0))
			{
				TRACE(_T("Failed to create animate control.\n"));
				return;
			}
			m_pWndAnimateCtrl->Open(IDR_DOWNLOAD);
			
			
			bool bRet = m_pMainFrame->m_wndStatusBar.AddPane(IDS_PANE_ANIMATE,m_nPosition);
			if(!bRet){
				AfxMessageBox(_T("Pane index out of range\nor pane with same ID already exists in the status bar"), MB_ICONERROR);
				return;
			}
			
			int nIndex = m_pMainFrame->m_wndStatusBar.CommandToIndex(IDS_PANE_ANIMATE);
			if (nIndex == -1)
				return;
			
			m_pMainFrame->m_wndStatusBar.SetPaneWidth(nIndex, 16);
			m_pMainFrame->m_wndStatusBar.AddPaneControl(m_pWndAnimateCtrl, IDS_PANE_ANIMATE, true);
		}
		break;
	
	case 6: // label
		{
			m_pWndLabel = new CExtStatusBarLabel;
			if (!m_pWndLabel->Create(
				_T("Prof-UIS"),
				WS_CHILD|WS_VISIBLE|WS_TABSTOP|SS_CENTER,
				CRect(0,0,0,0), 
				&m_pMainFrame->m_wndStatusBar, 
				0))
			{
				TRACE(_T("Failed to create label control.\n"));
				return;
			}
			
			m_pWndLabel->SetFont(
				CFont::FromHandle(
				(HFONT)::GetStockObject(DEFAULT_GUI_FONT)
				)
				);

			bool bRet = m_pMainFrame->m_wndStatusBar.AddPane(IDS_PANE_LABEL,m_nPosition);
			if(!bRet){
				AfxMessageBox(_T("Pane index out of range\nor pane with same ID already exists in the status bar"), MB_ICONERROR);
				return;
			}
			
			int nIndex = m_pMainFrame->m_wndStatusBar.CommandToIndex(IDS_PANE_LABEL);
			if (nIndex == -1)
				return;
			
			m_pMainFrame->m_wndStatusBar.SetPaneWidth(nIndex, 70);
			m_pMainFrame->m_wndStatusBar.AddPaneControl(m_pWndLabel, IDS_PANE_LABEL, true);
		}
		break;
	}
}

//////////////////////////////////////////////////////////////////////////

void CChildFormView::OnRemovePane() 
{
	UpdateData();
	if( m_nPosition < 1 || m_nPosition > 20 )
		return;

	if(!m_pMainFrame->m_wndStatusBar.RemovePane(
		m_pMainFrame->m_wndStatusBar.GetItemID(m_nPosition))
		)
	{
		CString s;
		s.Format(_T("Pane %d was not found in the status bar \nor must be at least one of them."), m_nPosition);
		AfxMessageBox(s, MB_ICONERROR);
	}
}

//////////////////////////////////////////////////////////////////////////

void CChildFormView::OnStatusBarButton() 
{
	AfxMessageBox(_T("StatusBar Button Clicked."));
}

//////////////////////////////////////////////////////////////////////////

void CChildFormView::OnDisablePane() 
{
	UpdateData();
	if( m_nPosition < 1 || m_nPosition > 20 )
		return;
	
	UINT nID, nStyle;
	int cxWidth;
	
	m_pMainFrame->m_wndStatusBar.GetPaneInfo(m_nPosition, nID, nStyle, cxWidth);
	
	bool bDisabled = ((nStyle&SBPS_DISABLED) == 0);

	m_pMainFrame->m_wndStatusBar.SetPaneStyle(
		m_nPosition,
		//nID,
		bDisabled 
			? nStyle | SBPS_DISABLED 
			: nStyle & ~SBPS_DISABLED
		//`cxWidth
		);
}

//////////////////////////////////////////////////////////////////////////

void CChildFormView::CheckControls()
{
	if(!m_bInitComplete)
		return;
	
	UpdateData();
	if( m_nPosition < 1 ){
		m_nPosition = 1;
		UpdateData(0);
		return;
	}
	if( m_nPosition > 20 ){
		m_nPosition = 20;
		UpdateData(0);
		return;
	}
	
	int nCount = m_pMainFrame->m_wndStatusBar.GetPaneCount();

	if( m_nPosition >= nCount )
	{
		m_btnDisablePane.EnableWindow(FALSE);
		m_btnRemovePane.EnableWindow(FALSE);
		if( m_nPosition != nCount ){
			m_btnAddPane.EnableWindow(FALSE);
			return;
		}
	}
	else
	{
		m_btnDisablePane.EnableWindow(TRUE);
		m_btnRemovePane.EnableWindow(TRUE);
	}

	bool bFinded = false;
	int i=0;

	switch(m_nPaneType) {
	case 0:
		for(i=0; i<m_pMainFrame->m_wndStatusBar.GetPaneCount(); i++)
			if( IDS_PANE_TEXT == m_pMainFrame->m_wndStatusBar.GetItemID(i) ){
				bFinded = true;
				break;
			}
		break;
	case 1:
		for(i=0; i<m_pMainFrame->m_wndStatusBar.GetPaneCount(); i++)
			if( IDS_PANE_EDIT == m_pMainFrame->m_wndStatusBar.GetItemID(i) ){
				bFinded = true;
				break;
			}
		break;
	case 2:
		for(i=0; i<m_pMainFrame->m_wndStatusBar.GetPaneCount(); i++)
			if( IDS_PANE_PROGRESS == m_pMainFrame->m_wndStatusBar.GetItemID(i) ){
				bFinded = true;
				break;
			}
		break;
	case 3:
		for(i=0; i<m_pMainFrame->m_wndStatusBar.GetPaneCount(); i++)
			if( IDS_PANE_SLIDER_CTRL == m_pMainFrame->m_wndStatusBar.GetItemID(i) ){
				bFinded = true;
				break;
			}
		break;
	case 4:
		for(i=0; i<m_pMainFrame->m_wndStatusBar.GetPaneCount(); i++)
			if( IDS_PANE_BUTTON == m_pMainFrame->m_wndStatusBar.GetItemID(i) ){
				bFinded = true;
				break;
			}
		break;
	case 5:
		for(i=0; i<m_pMainFrame->m_wndStatusBar.GetPaneCount(); i++)
			if( IDS_PANE_ANIMATE == m_pMainFrame->m_wndStatusBar.GetItemID(i) ){
				bFinded = true;
				break;
			}
		break;
	case 6:
		for(i=0; i<m_pMainFrame->m_wndStatusBar.GetPaneCount(); i++)
			if( IDS_PANE_LABEL == m_pMainFrame->m_wndStatusBar.GetItemID(i) ){
				bFinded = true;
				break;
			}
		break;
	}

	m_btnAddPane.EnableWindow( !bFinded );
	
}

//////////////////////////////////////////////////////////////////////////

void CChildFormView::OnUpdateAppAbout(CCmdUI* pCmdUI) 
{
	pCmdUI;
	CheckControls();
}